const express = require("express");
const bodyParser = require("body-parser");
const mysql = require("mysql2/promise"); // 使用 promise 版本的 mysql2
const app = express();

// 中间件
app.use(bodyParser.json()); //解析请求体中的JSON数据，使得req.body可以获取到客户端发送的JSON数

// 设置 CORS 头，解决跨域问题
app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
  next();
});

// 数据库配置
const dbConfig = {
  host: "localhost",
  user: "root",
  password: "123456",
  database: "learndata",
};

// 创建数据库连接池
const pool = mysql.createPool(dbConfig); //接池可以复用连接，提高性能。

// 处理数据库错误
const handleDatabaseError = (res, err) => {
  console.log("Database error:", err.message);
  res.status(500).json({
    error: "Database error occurred",
  });
};

// 知识点：req 和 res 参数分别代表请求（request）和响应（response）对象
// 1.  eq 对象包含了客户端请求的所有信息，包括请求头、请求体、查询参数、路由参数等
//   req.body：包含客户端发送的请求体数据，通常用于处理POST、PUT等请求。可以通过中间件如 body-parser 来解析请求体中的JSON数据。
//   req.params：包含路由中的参数，例如在路径 /news/:id 中，req.params.id 就是客户端请求的ID。
//   req.query：包含URL查询参数，例如在路径 /news?category=tech 中，req.query.category 就是 tech。
//   req.headers：包含请求头信息，如 User-Agent、Authorization 等。
//   req.method：包含请求方法，如 GET、POST 等。
// 2.res 对象用于向客户端发送响应，包括设置响应头、响应状态码、发送响应数据等。以下是一些常用的 res 方法和属性：
//   res.send(data)：向客户端发送响应数据，可以是字符串、JSON、HTML等。
//   res.json(data)：向客户端发送JSON格式的数据。
//   res.status(code)：设置HTTP响应状态码，如 200（成功）、404（未找到）、500（服务器错误）等。
//   res.setHeader(name, value)：设置响应头。
//   res.end()：结束响应过程。

// 处理 POST 请求
app.post("/", (req, res) => {
  res.send("Hello World");
});

// // 处理 news 页面 GET 请求
// app.get("/news", async (req, res) => {
//   try {
//     const [rows] = await pool.execute("SELECT * FROM news ORDER BY datetime DESC");
//     res.json(rows);
//   } catch (err) {
//     handleDatabaseError(res, err);
//   }
// });

// 处理news页面POST请求
app.post("/news", async (req, res) => {
  console.log(req.body);
  var type = req.body.type;
  var sql =
    "select * from news where article_type=" + type + " order by datetime desc";
  try {
    const [rows] = await pool.execute(sql); //执行SQL查询，并将结果返回给客户端
    res.json(rows);
  } catch (err) {
    handleDatabaseError(res, err);
  }
});

//处理newsdetail页面post 请求
app.post("/newsdetail", async (req, res) => {
  console.log(req.body);
  var id = req.body.newsId;
  var sql = "select * from news where id=" + id;
  try {
    const [rows] = await pool.execute(sql);
    res.json(rows);
  } catch (err) {
    handleDatabaseError(res, err);
  }
});

//处理video页面POST请求
app.post("/video", async (req, res) => {
  console.log(req.body);
  var type = req.body.type;
  var sql =
    "select * from video where video_type = " +
    type +
    " order by datetime desc";
  try {
    const [rows] = await pool.execute(sql);
    res.json(rows);
  } catch (err) {
    handleDatabaseError(res, err);
  }
});

//处理点赞功能
app.post("/updatevideo", async (req, res) => {
  var id = req.body.id;
  var likestatus = req.body.likestatus;
  var like_count = req.body.like_count;
  var sql = "update video set likestatus=" + likestatus + ",like_count=" + like_count + " where id=" + id;
  try {
    const [rows] = await pool.execute(sql);
    res.json(rows);
  } catch (err) {
    handleDatabaseError(res, err);
  }
});


// 话题上传
app.post("/addtopic", async (req, res) => {
  console.log("Received data:", req.body);
  const imgs = JSON.stringify(req.body.imgs) || null;
  var sql = "insert into topic(id,title,content,imgs) values(0,'" + req.body.title + "','" + req.body.content + "','" + imgs + "')";
  try {
    const [rows] = await pool.execute(sql);
    res.json(rows);
  } catch (err) {
    handleDatabaseError(res, err);
  }
});

//处理topic页面POST请求
app.post("/topic", async (req, res) => {
  console.log(req.body);
  var type = req.body.type;
  var sql =
    "select * from topic" 
  try {
    const [rows] = await pool.execute(sql);
    res.json(rows);
  } catch (err) {
    handleDatabaseError(res, err);
  }
});

// 监听 3000 端口
const port = 3000;
app.listen(port, () => {
  console.log(`Server running at http://127.0.0.1:${port}`);
  // console.log("Server running at http://127.0.0.1:" + port);
});
